package tools

import (
	"fmt"
	"mcp-clarification-service/internal/protocol"
)

// Registry 工具注册表
type Registry struct {
	tools map[string]protocol.ToolDefinition
}

// NewRegistry 创建新的工具注册表
func NewRegistry() *Registry {
	r := &Registry{
		tools: make(map[string]protocol.ToolDefinition),
	}
	r.registerDefaultTools()
	return r
}

// registerDefaultTools 注册默认工具
func (r *Registry) registerDefaultTools() {
	// 单选题工具
	r.tools["ask_single_choice"] = protocol.ToolDefinition{
		Name:        "ask_single_choice",
		Title:       "单选题",
		Description: "向用户提出单选题，用户需要从多个选项中选择一个",
		InputSchema: GetSingleChoiceSchema(),
	}

	// 多选题工具
	r.tools["ask_multiple_choice"] = protocol.ToolDefinition{
		Name:        "ask_multiple_choice",
		Title:       "多选题",
		Description: "向用户提出多选题，用户可以选择一个或多个选项",
		InputSchema: GetMultipleChoiceSchema(),
	}

	// 简答题工具
	r.tools["ask_free_text"] = protocol.ToolDefinition{
		Name:        "ask_free_text",
		Title:       "简答题",
		Description: "向用户提出开放式问题，用户可以输入文字回答",
		InputSchema: GetFreeTextSchema(),
	}

	// 批量提问工具
	r.tools["ask_questions"] = protocol.ToolDefinition{
		Name:        "ask_questions",
		Title:       "批量提问",
		Description: "一次性向用户提出多个问题（支持单选、多选、简答的任意组合）",
		InputSchema: GetAskQuestionsSchema(),
	}
}

// Get 获取工具定义
func (r *Registry) Get(name string) (protocol.ToolDefinition, bool) {
	tool, ok := r.tools[name]
	return tool, ok
}

// List 列出所有工具
func (r *Registry) List() []protocol.ToolDefinition {
	tools := make([]protocol.ToolDefinition, 0, len(r.tools))
	// 按固定顺序返回
	order := []string{"ask_single_choice", "ask_multiple_choice", "ask_free_text", "ask_questions"}
	for _, name := range order {
		if tool, ok := r.tools[name]; ok {
			tools = append(tools, tool)
		}
	}
	return tools
}

// Register 注册新工具
func (r *Registry) Register(tool protocol.ToolDefinition) error {
	if tool.Name == "" {
		return fmt.Errorf("tool name cannot be empty")
	}
	if _, exists := r.tools[tool.Name]; exists {
		return fmt.Errorf("tool %s already registered", tool.Name)
	}
	r.tools[tool.Name] = tool
	return nil
}
